package com.jt.controller;

import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jt.pojo.User;
import com.jt.service.UserService;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;

import java.util.List;

/*
业务文档:平时要每月花一部分时间记录业务接口文档,以后面试的时候会用
    包含的内容:
        1.业务场景,业务与功能属性等...
        2.业务端调用的细节. web-sso
        3.明确请求路径 url地址
        4.明确请求的参数信息 几个 类型 作用
        5.明确返回结果 void xxx属性 对象
    注意事项:
        你以为的不一定是你以为的...  当需求不明确时  弄清业务之后在动手
        传统开发模式
        敏捷开发

    界面JS分析:
        1.定位哪些是http://sso.jt.com/user/check
        2.快捷键查找前端:Ctrl+Shift+F,双击定位到写写死的部分:Url的Js
 */
@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private Jedis jedisCluster;

    /**JSONP实现用户数据校验
     * url: http://sso.jt.com/user/check/{param}/{type}
     * /{param}: 要校验的数据
     * /{type}: 校验的字段
     * @return JSONPObject->SysResult(true/false)
     */
    @RequestMapping("/check/{param}/{type}")
    public JSONPObject checkUser(@PathVariable String param,@PathVariable Integer type,String callback){//请求中拼接了callback
        boolean flag = userService.checkUser(param,type);
        //int a=1/0;如果出了错SystemException返回给前端一个SysResult对象,而不是Jsonp格式的对象,需要修改全局异常处理类
        return new JSONPObject(callback, SysResult.success(flag));
        //callback(Json结构)
    }

    /**完成HttpClient的业务调用
     * url:http://sso.jt.com/user/findUserList
     * 返回值:UserJson
     */
    @RequestMapping("findUserList")
    public List<User> findUserList(){
       return userService.findUserList();
    }

    /**
     * 跨越请求:从redis中完成用户信息的获取
     * url: http://sso.jt.com/user/query/f6c4e13bdd97478cba2aff43a826b4fa?callback=jsonp1608020590978&_=1608020591106
     * 参数:ticket相关信息
     *      callback
     * 返回值SysResult(用户数据)
     */
    @RequestMapping("query/{ticket}")
    public JSONPObject findUserByTicket(@PathVariable String ticket,String callback){
        //从redis中获取数据
        if (jedisCluster.exists(ticket)){//如果redis中有数据则正确返回
            String userJson = jedisCluster.get(ticket);
            SysResult sysResult = SysResult.success(userJson);
            return new JSONPObject(callback, sysResult);
        }else {//如果redis中没数据,说明你拿着假数据来骗我,那我就fail
            return new JSONPObject(callback, SysResult.fail());
        }
    }


}
